from typing import Any
from mcp.server.fastmcp import FastMCP
from tools.weather_tool import fetch_weather, format_weather
from tools.car_tool import fetch_car_enter, format_car_enter
from tools.fuel_jump import jump_url
from tools.decoal_tool import decoal_car
from dotenv import load_dotenv
from tools.pyecharts_tool import echarts_bar_url, echarts_pair_url, echarts_line_url, echarts_table_url
from tools.report_tool import find_home_quantity_price, format_quantity_price 
import datetime

load_dotenv()
# 初始化 MCP 服务器
mcp = FastMCP("fuelMcp")

@mcp.tool()
async def query_weather(city: str) -> str:
    """
    输入指定城市的英文名称，返回今日天气查询结果。
    :param city: 城市名称（需使用英文）
    :return: 格式化后的天气信息
    """
    data = await fetch_weather(city)
    if not data:
        return "⚠️ 无法获取天气信息"
    return format_weather(data)

@mcp.tool()
async def query_car_enter (beginInTime: str, endInTime: str) -> str:
    """
    查询汽车入厂数据，返回这段时间内汽车入厂的查询结果。
    :param beginInTime: 开始时间（需要精确到秒）
    :param endInTime: 结束时间（需要精确到秒）
    :return: 返回这段时间的车牌号和入厂流水号
    """
    data = await fetch_car_enter(beginInTime, endInTime)
    if not data:
        return "⚠️ 无法获取汽车入厂信息"
    return format_car_enter(data)


@mcp.tool()
async def car_decoal (vehicleNo: str, monitorPerson: str, backReason: str) -> str:
    """
    输入汽车车牌号和汽车退煤原因和退煤监督人，返回退煤结果。
    :param vehicleNo: 汽车车牌号
    :param monitorPerson: 退煤监督人
    :param backReason: 退煤原因
    :return: 返回退煤结果
    """
    data: Any = await decoal_car(vehicleNo, monitorPerson, backReason)
    return data

@mcp.tool()
async def jump_page (pageNmae:str) -> any:
    """
    输入跳转页面，返回与之模糊匹配的页面名称和id。
    :param pageNmae: 跳转页面名称
    :return: 返回与之模糊匹配的页面名称和id
    """
    data: Any = await jump_url(pageNmae)
    return data

@mcp.tool()
async def get_current_time () -> any:
    """
    输入对时间的描述（今天，本月，本日，最近等），返回今天的时间。
    :param query: 用户的描述
    :return: 今天的时间
    """
    today = datetime.date.today()
    formatted_date = today.strftime("%Y-%m-%d")
    return  "今天的日期是:" + formatted_date

@mcp.tool()
async def get_echarts_pair_url(datasets: Any, title: str) -> any:
    """
    输入生成饼图图表
    :param datasets: 饼图的数据集，格式为[['数据集名称', '数据集的值']]
    :param title: 柱状图的标题
    :return: 返回
    """
    chaturl = await echarts_pair_url(datasets, title, id)
    return "图表地址是:" + chaturl

@mcp.tool()

async def get_echarts_bar_url(x_data: any,y_data: any, title: str) -> any:
    """
    输入柱状图图表
    :param x_data: 柱状图的标签，格式为['标签1', '标签2']
    :param y_data: 柱状图的纵坐标，格式为[{"name": "数据集名称", "data": [1, 2]}]
    :param title: 柱状图的标题
    :return: 返回
    """
    chaturl = await echarts_bar_url(x_data, y_data, title)
    return "图表地址是:" + chaturl

@mcp.tool()
async def get_echarts_line_url(x_data: any,y_data: any, title: str) -> any:
    """
    输入折线图图表
    :param x_data: 柱折线的标签，格式为['标签1', '标签2']
    :param y_data: 柱折线的纵坐标，格式为[{"name": "数据集名称", "data": [1, 2]}]
    :param title: 柱折线的标题
    :return: 返回
    """
    chaturl = await echarts_line_url(x_data, y_data, title)
    return "图表地址是:" + chaturl

@mcp.tool()
async def get_quantity_price(beginInTime: str, endInTime: str) -> any:
    """
    统计煤场量质价的出库、入库、库存数量，返回这段时间内煤场量质价的查询结果。
    :param beginInTime: 开始时间（需要精确到秒）
    :param endInTime: 结束时间（需要精确到秒）
    :return: 返回这段时间内煤场量质价的查询结果
    """
    data = await find_home_quantity_price(beginInTime, endInTime)
    if not data:
        return "⚠️ 无法获取煤场量质价信息"
    return format_quantity_price(data)

@mcp.tool()
async def get_echarts_table_url(headers: any, rows: any, title: str) -> any:
    """
    输入表格
    :param headers: 表格的表头，格式为['表头1', '表头2']
    :param rows: 表格的行的数据，格式为[['行1的数据1', '行1的数据2'], ['行2的数据1', '行2的数据2']
    :param title: 表格的标题
    :return: 返回
    """
    chaturl = await echarts_table_url(headers, rows, title)
    return "图表地址是:" + chaturl

if __name__ == "__main__":
    mcp.run(transport='stdio')